#ifndef TYPES_H
#define TYPES_H

#include "Framework/StdHeaders.h"
#include <assert.h>
#include <windows.h>

namespace tyro
{

		/* 32 bit floating point variable */
		typedef float FLOAT_32;

		/* 64 bit floating point variable */
		typedef double FLOAT_64;

		/* 8 bit Unsigned INT */
		typedef unsigned char UINT_8;

		/* 16 bit Unsugned INT */
		typedef unsigned short UINT_16;

		/* 32 bit Unsigned INT */
		typedef unsigned __int32 UINT_32;

		/* 64 bit Unsigned INT */
		typedef unsigned __int64 UINT_64;

		/* 32 Signed INT */
		typedef signed __int32 INT_32;

		/* 64 Signed INT */
		typedef signed __int64 INT_64;

		/* Signed Short */
		typedef signed short SHORT_16;

		/* Unsigned Short */
		typedef unsigned short USHORT_16;

		/* Unsigned Char */
		typedef unsigned char UCHAR_32;

		/* OpenGL Polygon rasterization modes */
		enum PolygonMode
		{
			PM_POINTS = 0,
			PM_WIREFRAME = 1,
			PM_FILL = 2
		};

		/* Projection Types */
		enum ProjectionType
		{
			PT_ORTHOGRAPHIC,
			PT_PERSPECTIVE
		};

		enum VertexElementType
		{
			VET_FLOAT1 = 0,
			VET_FLOAT2 = 1,
			VET_FLOAT3 = 2,
			VET_FLOAT4 = 3,
			VET_COLOUR = 4,
			VET_SHORT1 = 5,
			VET_SHORT2 = 6,
			VET_SHORT3 = 7,
			VET_SHORT4 = 8,
			VET_UBYTE4 = 9,
			VET_COLOUR_ARGB = 10,
			VET_COLOUR_ABGR = 11
		};

		enum VertexElementSemantic {
			VES_POSITION = 1,
			VES_BLEND_WEIGHTS = 2,
			VES_BLEND_INDICES = 3,
			VES_NORMAL = 4,
			VES_DIFFUSE = 5,
			VES_SPECULAR = 6,
			VES_TEXTURE_COORDINATES = 7,
			VES_BINORMAL = 8,
			VES_TANGENT = 9,
			VES_COUNT = 9
		};

		enum VertexIndexType {
			VIT_32BIT,
			VIT_16BIT
		};

		enum RenderType 
		{
			RT_POINT_LIST = 0,
			RT_LINE_LIST = 1,
			RT_LINE_STRIP = 2,
			RT_TRIANGLE_LIST = 3,
			RT_TRIANGLE_STRIP = 4,
			RT_TRIANGLE_FAN = 5
		};

		enum TransformSpace
		{
			TS_LOCAL,
			TS_PARENT,
			TS_WORLD
		};

		/* Defines the frame buffer types */
		enum FrameBufferType
		{
			FBT_COLOUR	= 0x1,
			FBT_DEPTH	= 0x2,
			FBT_STENCIL	= 0x4
		};
		
		/*Device culling modes*/
		enum CullingMode
		{
			CULL_NONE = 1,
			CULL_CLOCKWISE = 2,
			CULL_ANTICLOCKWISE = 3
		};

		typedef UINT_32 RGBA;
		typedef UINT_32 ARGB;
		typedef UINT_32 ABGR;
		typedef UINT_32 BGRA;


		typedef unsigned long long int ResourceHandle;

		

		typedef std::string String;

		

		template < typename T >
		struct vector
		{
			typedef typename std::vector<T> type;
			typedef typename std::vector<T>::iterator iterator;
			typedef typename std::vector<T>::const_iterator const_iterator;
		};

		template < typename T >
		struct list
		{
			typedef typename std::list<T> type;
			typedef typename std::list<T>::iterator iterator;
			typedef typename std::list<T>::const_iterator const_iterator;
		};

		template <typename T, typename P = std::less<T>>
		struct set
		{
			typedef typename std::set<T, P> type;
			typedef typename std::set<T, P>::iterator iterator;
			typedef typename std::set<T, P>::const_iterator const_iterator;
		};

		template <typename K, typename V, typename P = std::less<K>>
		struct map
		{
			typedef typename std::map<K, V, P> type;
			typedef typename std::map<K, V, P>::iterator iterator;
			typedef typename std::map<K, V, P>::const_iterator const_iterator;
		};

		template <typename K, typename V, typename P = std::less<K>>
		struct multimap
		{
			typedef typename std::multimap<K, V, P> type;
			typedef typename std::multimap<K, V, P>::iterator iterator;
			typedef typename std::multimap<K, V, P>::const_iterator const_iterator;
		};


		// Name / value parameter pair (first = name, second = value)
		typedef map<String, String>::type NameValuePairList;

#define  HashMap ::stdext::hash_map;
#define  HashSet ::stdext::hash_set;
	


		

}

#endif